松本行弘的程序世界 8 正则表达式

正则表达式基础

检索“像那样的东西”

正则表达式的语法

普通字符

除了表中所示的元字符以外的普通字符,都与该字符自身相匹配。

屏幕快照 2018-07-12 上午10.28.08
屏幕快照 2018-07-12 上午10.28.08

字符集合

用括号(【】)括起来的部分为字符集合。与括号内所含的每一个字符都匹配。比如,【abcde】能与小写字母abcde中的任何一个相匹配。
字符集合中,用中划线(-)来指定范围。所以,【abcde】可以用【a-e】来代替。
字符集合中,第一个字符是【\^】时,表示取反。就是说,不与括号(【】)中的字符相匹配。

任意一个字符

表示任意一个字符读得模式是“.”。除了匹配换行符。

重复

屏幕快照 2018-07-12 上午10.42.59
屏幕快照 2018-07-12 上午10.42.59

贪婪与懒惰

贪婪:寻找符合的最长的,遍历完再回溯,
懒惰:寻找第一个符合的。

分组

将模式绑定起来的功能称为分组。(ma)+

选择

|

锚点

指定位置而不是字符来进行匹配。称为锚点(anchor)。

屏幕快照 2018-07-12 上午10.53.24
屏幕快照 2018-07-12 上午10.53.24

三个陷阱

记号多、密度高的表达式

为应对这一问题,出现了扩展正则表达式。

0次以上的重复

贪婪型匹配

正则表达式对象

面向对象语言Ruby中,所有数据都是对象。正则表达式也是对象。
Ruby程序中正则表达式对象写成/.*/的样子。
正则表达式对象可以用正则表达式类方法生成。程序中由组合字符串生成正则表达式时,使用类方法更自然。

选项

Ruby正则表达式末尾斜杠的后面,可以为这个正则表达式添加选项。

屏幕快照 2018-07-12 上午11.34.28
屏幕快照 2018-07-12 上午11.34.28

屏幕快照 2018-07-12 上午11.35.23
屏幕快照 2018-07-12 上午11.35.23

正则表达式匹配的方法

屏幕快照 2018-07-12 上午11.37.23
屏幕快照 2018-07-12 上午11.37.23

特殊变量

Ruby中有源于Perl的特殊变量。以$开头的变量。

屏幕快照 2018-07-12 上午11.41.33
屏幕快照 2018-07-12 上午11.41.33

字符串与正则表达式

屏幕快照 2018-07-12 上午11.43.29
屏幕快照 2018-07-12 上午11.43.29

split的本质

分割字符串的方法split,与正则表达式组合起来能实现很多功能。

字符串的扫描

置换

想要置换与字符串模式匹配的部分,可以用置换方法。

正则表达式的应用实例与“鬼车”

正则表达式是表达字符串模式的一种微型语言。正则表达式由字符本身、字符模式、锚点以及重复等组合而成。

解析日志文件的方法

避免使用$的方法

记号$不美观。Ruby中,以match方法替代=~运算符,就可以在程序中不使用这些记号了。

从邮件中取出日期的方法

典型拼写错误的检索方法

Ruby1.9的新功能“鬼车”

“鬼车”新正则表达式库。

1
2
3
4
5
6
DSL
Domain Specific Language,意为面向特定领域的编程语言。
DSL分内部DSL和外部DSL。
内部DSL,就是往既有的语言中加入特定领域的词汇,使之DSL化。如软件编译工具Rake中表达依存关系的内部DSL。
make是一个同样目的的工具,它使用Makefile来表达依存关系。Rake可以利用Ruby的编程功能、方法定义、条件分歧和循环等,不管关系有多复杂,都可以编程对应。
外部DSL,不是扩展现有的语言,而是面向特定目的,如SQL就是DSL的代表性例子。正则表达式也可以称作是以实现模式匹配为目的的外部DSL。